/**
 * 1、位运算符: & 、|  、^ 、 ~ 
 * 2、& 按位与 (逐位与)
 * 3、| 按位或 (逐位或)
 * 4、^ 按位异或 (逐位异或)
 * 5、~ 按位取反 (逐位取反)
 */

// 二进制只有两个计数符号: 0 、1
// 使用 0b 或 0B 作为前缀可以用 二进制形式 表示整数 
// 在书写数字时可以使用 下划线 分隔不同部分(不影响它表示的数值)
let first = 0b0000_0000_0000_0000_0000_0000_0100_1111;
console.log( first ); // 输出时仍然是十进制整数

// 十六进制计数符号: 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
// 使用 0x 或 0X 作为前缀可以用 十六进制形式 表示整数
let second = 0x0000_004F;
console.log( second ); // 输出时仍然是十进制整数

// 八进制只有八个计数符号: 0、1、2、3、4、5、6、7
// 使用 0 作为前缀可以用 八进制形式 表示整数
let third = 0777;
console.log( third ); // 输出时仍然是十进制整数

// 十进制计数符号: 0、1、2、3、4、5、6、7、8、9
let fourth = 12_3456_7890;
console.log( fourth );

console.log( '' );

let a = 0b0000_0000_0000_0000_0000_0000_0000_0101; // 5
let b = 0b0000_0000_0000_0000_0000_0000_0000_0111; // 7

//    0b0000_0000_0000_0000_0000_0000_0000_0101
// &  0b0000_0000_0000_0000_0000_0000_0000_0111
//    0b0000_0000_0000_0000_0000_0000_0000_0101
let c = a & b ; // 按位与
console.log( a , '&' , b , '=' , c );

let m = 0b0000_0000_0000_0000_0000_0000_0000_0101;
let n = 0b0000_0000_0000_0000_0000_0000_0000_0111 ;

//    0b0000_0000_0000_0000_0000_0000_0000_0101
// |  0b0000_0000_0000_0000_0000_0000_0000_0111
//    0b0000_0000_0000_0000_0000_0000_0000_0111
let p = m | n ; // 按位或
// console 的 log 函数可以接受 任意多个参数，多个参数间用逗号隔开即可
console.log( m , '|' , n , '=' , p );

let x = 0b0000_0000_0000_0000_0000_0000_0000_0101 ;
let y = 0b0000_0000_0000_0000_0000_0000_0000_0111 ;

//    0b0000_0000_0000_0000_0000_0000_0000_0101
// ^  0b0000_0000_0000_0000_0000_0000_0000_0111
//    0b0000_0000_0000_0000_0000_0000_0000_0010
let z = x ^ y ; // 按位异或
console.log( x , '^' , y , '=' , z );

let w = 0b0000_0000_0000_0000_0000_0000_0000_0101 ;
// ~  0b0000_0000_0000_0000_0000_0000_0000_0101
//    0b1111_1111_1111_1111_1111_1111_1111_1010
let t = ~w ; // 按位取反
console.log( w , t );

